package com.own.component.common.util.encrypt;

import com.alibaba.fastjson2.JSON;
import com.own.component.common.util.encrypt.model.CustomEncryptKey;

/**
 * BaseEncryptUtil
 *
 * @author 陈学礼
 * @date 2020/6/5 14:08
 */
public interface BaseEncryptUtil {

    /**
     * 随机生成密钥对
     *
     * @return 返回key
     */
    default CustomEncryptKey buildKey() {
        return null;
    }

    /**
     * 加密
     *
     * @param content 加密内容
     * @return 加密后的内容
     */
    default String encrypt(String content) {
        return content;
    }

    /**
     * 加密
     *
     * @param content 加密内容
     * @return 加密后的内容
     */
    default String encrypt(Object content) {
        return encrypt(JSON.toJSONString(content));
    }

    /**
     * 解密
     *
     * @param content 解密内容
     * @return 解密后的内容
     */
    default String decrypt(String content) {
        return content;
    }

    /**
     * 解密 并转对象
     *
     * @param content 解密内容
     * @param clazz   对象
     * @param <T>     对象类型
     * @return 对象
     */
    default <T> T decrypt(String content, Class<T> clazz) {
        return JSON.parseObject(decrypt(content), clazz);
    }

    /**
     * 公钥加密
     *
     * @param content          加密内容
     * @param customEncryptKey 秘钥
     * @return 加密后的内容
     */
    default String encrypt(String content, CustomEncryptKey customEncryptKey) {
        return content;
    }

    /**
     * 公钥加密
     *
     * @param content          加密内容
     * @param customEncryptKey 秘钥
     * @return 加密后的内容
     */
    default String encrypt(Object content, CustomEncryptKey customEncryptKey) {
        return encrypt(JSON.toJSONString(content), customEncryptKey);
    }

    /**
     * 私钥解密
     *
     * @param content          解密内容
     * @param customEncryptKey 秘钥
     * @return 解密后的内容
     */
    default String decrypt(String content, CustomEncryptKey customEncryptKey) {
        return content;
    }

    /**
     * 私钥解密 并转对象
     *
     * @param content          解密内容
     * @param clazz            对象
     * @param customEncryptKey 秘钥
     * @param <T>              对象类型
     * @return 对象
     */
    default <T> T decrypt(String content, Class<T> clazz, CustomEncryptKey customEncryptKey) {
        return JSON.parseObject(decrypt(content, customEncryptKey), clazz);
    }

}
